package person.bluext.singlegateway.frame.model;

import com.alibaba.fastjson.JSON;
import lombok.*;
import person.bluext.singlegateway.common.model.BasicModel;
import person.bluext.singlegateway.frame.constants.ErrorCode;
import person.bluext.singlegateway.frame.constants.RespStatus;

/**
 * Description : Contract of Response
 *
 * @author : bluext
 */
@Setter
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Response extends BasicModel {

    // 响应码
    private String status;

    // 错误编码
    private String errCode;

    // 响应码为00时 - 返回json格式数据 ； 响应码为-99时 - 返回错误描述
    // @see RespStatus
    private String data;

    /**
     * 请求成功时返回响应结果
     *
     * @param data 响应结果
     * @return response实例
     */
    public static Response success(String data) {
        return new Response(RespStatus.REQ_SUCCESS.getStatus(), null, data);
    }

    /**
     * 请求成功时返回响应结果
     *
     * @param data 响应结果
     * @return response实例
     */
    public static Response success(Object data) {
        return new Response(RespStatus.REQ_SUCCESS.getStatus(), null, JSON.toJSONString(data));
    }

    /**
     * 请求成功时仅返回状态码
     *
     * @return response实例
     */
    public static Response success() {
        return new Response(RespStatus.REQ_SUCCESS.getStatus(), null, null);
    }

    /**
     * 请求失败时仅返回错误描述
     *
     * @param errorMsg 错误描述
     * @return response实例
     */
    public static Response fail(String errorMsg) {
        return new Response(RespStatus.REQ_FAIL.getStatus(), null, errorMsg);
    }

    /**
     * 请求失败时返回错误码及错误描述
     *
     * @param errorCode 错误码
     * @param errorMsg  错误描述
     * @return response实例
     */
    public static Response fail(String errorCode, String errorMsg) {
        return new Response(RespStatus.REQ_FAIL.getStatus(), errorCode, errorMsg);
    }

    /**
     * 请求失败时返回错误码及错误描述
     *
     * @param errorCode 错误信息
     * @return response实例
     */
    public static Response fail(ErrorCode errorCode) {
        return new Response(RespStatus.REQ_FAIL.getStatus(), errorCode.getErrorCode(), errorCode.getDesc());
    }
}
